home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume15 / dmake-3.6 / part10 < prev    next >
Encoding:
Text File  |  1990-10-14  |  39.2 KB  |  1,213 lines

  1. Newsgroups: comp.sources.misc
  2. X-UNIX-From: dvadura@watdragon.waterloo.edu
  3. subject: v15i062: dmake version 3.6 (part 10/25)
  4. from: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  5. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  6.  
  7. Posting-number: Volume 15, Issue 62
  8. Submitted-by: Dennis Vadura <dvadura@watdragon.waterloo.edu>
  9. Archive-name: dmake-3.6/part10
  10.  
  11. #!/bin/sh
  12. # this is part 10 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file msdos/exec.asm continued
  15. #
  16. CurArch=10
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file msdos/exec.asm"
  27. sed 's/^X//' << 'SHAR_EOF' >> msdos/exec.asm
  28. X;        0a  pointer to fcb2
  29. X        mov    cx, cs
  30. X        mov    [word ptr ex_cmdtail], offset cmdtail
  31. X        mov    [word ptr ex_cmdtail+2], cx
  32. X        mov    ax, [envseg]
  33. X        mov    [ex_envseg], ax
  34. X
  35. X; set up registers for exec call
  36. X;    ds:dx    - pointer to pathname of program to execute
  37. X;    es:bx    - pointer to above parameter block
  38. X        mov    dx, offset cmdpath
  39. X        mov    es, cx
  40. X        mov    bx, offset exec_block
  41. X
  42. X; Under DOS 2.x exec is notorious for clobbering registers and guarantees
  43. X; to preserve only cs:ip.
  44. X        push    ds
  45. X        mov    [ex_sp], sp
  46. X        mov    [ex_ss], ss
  47. X        mov    [ex_error], 0        ; clear exec error code
  48. X        inc    [in_exec]        ; set internal flag
  49. X        mov    ax, 04b00H
  50. X        int    21H
  51. X
  52. X; returned from exec, so restore possibly clobbered registers.
  53. X        mov    ss, cs:ex_ss
  54. X        mov    sp, cs:ex_sp
  55. X        pop    ds
  56. X
  57. X; check to make certain the exec call worked.
  58. X        jnc    it_worked
  59. X
  60. X; exec call failed.  Save return code from msdos.
  61. X        mov    [ex_error], ax
  62. X        jmp    leave_exec
  63. X
  64. Xit_worked:    mov    ah, 04dH    ; get the return code
  65. X        int    21H
  66. X        cbw
  67. X        mov    [retcode], ax
  68. X
  69. Xleave_exec:     mov    [in_exec], 0    ; all done, reset in_exec flag
  70. X        cmp    [swap], 0    ; check swap, if non-zero swap back in
  71. X        je    no_swap_in
  72. X        call    swap_in
  73. Xno_swap_in:    ret
  74. Xdo_exec endp
  75. X
  76. X
  77. X
  78. X;==============================================================================
  79. X; Everything past this point is overwriten with the environment and new
  80. X; program after the currently executing program is swapped out.
  81. X;==============================================================================
  82. Xoverlay_code_here label word
  83. X
  84. X;-----------------------------------------------------------------------------
  85. X; Figure out where we can swap to and initialize the resource we are going to
  86. X; use.  We try XMS, EMS, and a tempfile (if specified), in that order.  We set
  87. X; [cs:swap] to the correct value based on which of the resources exists.
  88. X; If none can be used, then [cs:swap] is set to 0, and no swap takes place.
  89. X; The exec code will still attempt to execute the child in this instance, but
  90. X; may fail due to lack of resources.   Each swap_out_* routine must provide
  91. X; it's own clean-up handler should it not be able to write all program
  92. X; segments to the swap resource.
  93. Xinit_swap proc near
  94. X        mov    [swap], 0
  95. X;call    init_xms
  96. X;jnc    init_done
  97. X;call    init_ems
  98. X;jnc    init_done
  99. X        call    init_file
  100. Xinit_done:    ret
  101. Xinit_swap endp
  102. X
  103. X
  104. X;-----------------------------------------------------------------------------
  105. X; This routine is used to walk the DOS alocated memory block chain and,
  106. X; starting at address supplied in the es register.  For each block it
  107. X; calls the routine specified by the bx register with the segment length
  108. X; in si, and it's address in di.  It does not apply the routine to the
  109. X; segment if the segment is the same as the current program's [cs:psp] value.
  110. Xmemheader struc
  111. X   magic    db    ?    ; either 'Z' for end or 'M' for allocated
  112. X   owner    dw    ?    ; psp of owner block
  113. X   len        dw    ?    ; length in paragraphs of segment
  114. Xmemheader ends
  115. X
  116. Xwalk_arena_chain proc near
  117. X        mov    si, word ptr es:3        ; get length
  118. X        mov    di, es
  119. X        inc    di
  120. X        mov    ax, word ptr es:1
  121. X        cmp    ax, cs:psp            ; is it owned by us?
  122. X        jne    walk_done            ; NOPE!  -- all done
  123. X        cmp    di, cs:psp            ; make sure we don't
  124. X        je    next_block            ; touch our psp
  125. X        push    di
  126. X        push    si
  127. X        push    bx
  128. X        call    bx                ; handle the segment
  129. X        pop    bx
  130. X        pop    si
  131. X        pop    di
  132. X        jc    exit_walk            ; if error then stop
  133. X        mov    al, byte ptr es:0        ; check if at end 
  134. X        cmp    al, 'Z'
  135. X        je    walk_done
  136. X
  137. Xnext_block:    add    di, si                ; go on to next segment
  138. X        mov    es, di
  139. X        jmp    walk_arena_chain
  140. Xwalk_done:    clc
  141. Xexit_walk:    ret
  142. Xwalk_arena_chain endp
  143. X
  144. X
  145. X;-----------------------------------------------------------------------------
  146. X; This routine takes a dos segment found in the di register and free's it.
  147. Xfree_dos_segment proc near
  148. X        mov    es, di        ; free dos memory block
  149. X        mov    ah, 49H
  150. X        int    21H
  151. X        ret
  152. Xfree_dos_segment endp
  153. X
  154. X
  155. X;-----------------------------------------------------------------------------
  156. X; Called to invoke write_segment with proper values in the al register.  Only
  157. X; ever called from walk_arena_chain, and so al should be set to seg_alloc.
  158. Xwrite_segment_data label near
  159. X        mov    al, seg_alloc    ; and fall through into write_segment
  160. X;-----------------------------------------------------------------------------
  161. X; This routine writes a segment as a block of data segments if the number of
  162. X; paragraphs to write exceeds 0x0fff (rarely the case).
  163. X; It stuffs the info into tmpseg, and then calls wheader and wseg to get the
  164. X; data out.
  165. X;
  166. X;    di:dx    segment:offset of segment;  offset is ALWAYS zero.
  167. X;    si    number of paragraphs to write.
  168. X;    al    mode of header to write
  169. Xwrite_segment proc near
  170. X        push    di
  171. X        push    si
  172. X        xor    dx,dx
  173. X        mov    bx, [swap]
  174. X        call    [write_header+bx]
  175. X        pop    si
  176. X        pop    di
  177. X        jc    exit_wseg
  178. X
  179. Xdo_io_loop:    cmp    si, 0        ; are we done yet?
  180. X        je    exit_wseg    ; yup so leave.
  181. X        mov    cx, si        ; # of paragraphs to move
  182. X        cmp    cx, 0fffH    ; see if we have lots to move?
  183. X        jle    do_io
  184. X        mov    cx, 0fffH    ; reset to max I/O size
  185. X
  186. Xdo_io:        push    cx        ; save # of paragraphs we are writing
  187. X        shl    cx, 1        ; shift cx by four to the left
  188. X        shl    cx, 1
  189. X        shl    cx, 1
  190. X        shl    cx, 1
  191. X        push    di        ; save the start, and count left
  192. X        push    si
  193. X        mov    si, cx
  194. X        xor    dx,dx
  195. X        mov    al, seg_data
  196. X        mov    bx, [swap]
  197. X        push    bx
  198. X        call    [write_header+bx]
  199. X        pop    bx
  200. X        call    [write_seg+bx]
  201. X        pop    si
  202. X        pop    di
  203. X        pop    dx        ; original paragraph count in dx
  204. X        jc    exit_wseg    ; it failed so exit.
  205. X        add    di, dx        ; adjust the pointers, and continue.
  206. X        sub    si, dx
  207. X        jmp     do_io_loop
  208. Xexit_wseg:    ret
  209. Xwrite_segment endp
  210. X
  211. X
  212. X;=============================================================================
  213. X; THE FOLLOWING SECTION DEALS WITH ALL ROUTINES REQUIRED TO WRITE XMS RECORDS.
  214. X;=============================================================================
  215. Xinit_xms proc near
  216. X        ret
  217. Xinit_xms endp
  218. X
  219. Xwhdr_xms proc near
  220. X        ret
  221. Xwhdr_xms endp
  222. X
  223. Xwseg_xms proc near
  224. X        ret
  225. Xwseg_xms endp
  226. X;=============================================================================
  227. X
  228. X
  229. X;=============================================================================
  230. X; THE FOLLOWING SECTION DEALS WITH ALL ROUTINES REQUIRED TO WRITE EMS RECORDS.
  231. X;=============================================================================
  232. Xinit_ems proc near
  233. X        ret
  234. Xinit_ems endp
  235. X
  236. Xwhdr_ems proc near
  237. X        ret
  238. Xwhdr_ems endp
  239. X
  240. Xwseg_ems proc near
  241. X        ret
  242. Xwseg_ems endp
  243. X;=============================================================================
  244. X
  245. X
  246. X;=============================================================================
  247. X; THE FOLLOWING SECTION DEALS WITH ALL ROUTINES REQUIRED TO WRITE FILES.
  248. X;=============================================================================
  249. X;-----------------------------------------------------------------------------
  250. X; Attempt to create a temporary file.  If the tempfile name is NIL then return
  251. X; with the cary flag set.
  252. Xinit_file proc near
  253. X        mov    al, [tmpname]
  254. X        or    al, al
  255. X        je    err_init_file
  256. X        mov    dx, offset tmpname
  257. X        xor     cx, cx
  258. X        mov    ah, 03cH
  259. X        int    21H
  260. X        jc    err_init_file        ; if carry set then failure
  261. X        mov    [tmphandle], ax        ; init swapping
  262. X        mov    [swap], swap_file
  263. X        jmp    exit_init_file
  264. Xerr_init_file:    stc
  265. Xexit_init_file: ret
  266. Xinit_file endp
  267. X
  268. X
  269. X;-----------------------------------------------------------------------------
  270. X; This routine writes a segment header to a file.
  271. X; The header is a seven byte record formatted as follows:
  272. X;    segment address        - of data
  273. X;    offset address        - of data
  274. X;     length in paragraphs    - of data
  275. X;    mode            - 1 => segment header (allocate seg on read)
  276. X;                  0 => subsegment, don't allocate on read.
  277. X; Routine takes three arguments:
  278. X;    di:dx    segment:offset of segment
  279. X;    si    number of paragraphs to write.
  280. X;    al    mode of header to write
  281. Xwhdr_file proc near
  282. X        mov    [word ptr tmpseg], di    ; save the segment/offset
  283. X        mov    [word ptr tmpseg+2], dx
  284. X        mov    [word ptr tmpseg+4], si    ; save the segment length
  285. X        mov    [tmpseg+6], al
  286. X        mov    dx, offset tmpseg    ; write the header record out
  287. X        mov    cx, 7
  288. X        mov    bx, [tmphandle]
  289. X        mov    ah, 040H
  290. X        int    21H
  291. X        jc    exit_whdr_file        ; make sure it worked
  292. X        cmp    ax, 7
  293. X        je    exit_whdr_file        ; oh oh, disk is full!
  294. Xerr_whdr_file:    stc
  295. Xexit_whdr_file:    ret
  296. Xwhdr_file endp
  297. X
  298. X
  299. X;-----------------------------------------------------------------------------
  300. X; Write a segment to the temporary file whose handle is in cs:tmphandle
  301. X; Parameters for the write are assumed to be stored in the tmpseg data area.
  302. X; function returns carry set if failed, carry clear otherwise.
  303. Xwseg_file proc near
  304. X        push    ds
  305. X        mov    ds, word ptr cs:tmpseg ; Now write the whole segment
  306. X        mov    dx, word ptr cs:tmpseg+2
  307. X        mov    cx, word ptr cs:tmpseg+4
  308. X        mov    bx, cs:tmphandle
  309. X        mov    ah, 040H
  310. X        int    21H
  311. X        pop    ds
  312. X        jc    exit_wseg_file        ; make sure it worked
  313. X        cmp    ax, [word ptr tmpseg+4]
  314. X        je    exit_wseg_file
  315. Xerr_wseg_file:    stc                ; it failed (usually disk full)
  316. Xexit_wseg_file:    ret
  317. Xwseg_file endp
  318. X;=============================================================================
  319. X
  320. X
  321. X;=============================================================================
  322. X; _exec: THIS IS THE MAIN ENTRY ROUTINE TO THIS MODULE
  323. X;=============================================================================
  324. X; This is the main entry routine into the swap code and corresponds to the
  325. X; following C function call:
  326. X;
  327. X; exec( int swap, char far *program, char far *cmdtail,
  328. X;    int environment_seg, int env_size, char far *tmpfilename );
  329. X;
  330. X; Exec performs the following:
  331. X;    1. set up the local code segment copies of arguments to the exec call.
  332. X;    2. switch to a local stack frame so that we don't clobber the user
  333. X;       stack.
  334. X;    3. save old interrupt vectors for ctrl-brk.
  335. X;    4. install our own handler for the ctrl-brk interrupt, our handler
  336. X;       terminates the current running ess, proc and returns with non-zero
  337. X;       status code.
  338. X;    5. get our psp
  339. X;    6. setup arguments for exec call
  340. X;    7. exec the program, save result code on return.
  341. X;       8. restore previous ctrl-brk and crit-error handler.
  342. X;       9. restore previous ess proc stack, and segment registers.
  343. X;      10. return from exec with child result code in AX
  344. X;       and global _Interrupted flag set to true if child execution was
  345. X;       interrupted.
  346. X
  347. X; NOTE:  When first called the segments here assume the standard segment
  348. X;        settings.
  349. X        assume cs:@code, ds:DGROUP,es:DGROUP,ss:DGROUP
  350. X
  351. X        public    _exec
  352. X_exec proc
  353. X            push    bp        ; set up the stack frame
  354. X        mov    bp, sp
  355. X        push    si        ; save registers we shouldn't step on.
  356. X        push    di
  357. X        push    ds
  358. X
  359. X; set up for copying of parameters passed in with long pointers.
  360. X        push    cs        ; going to use lodsb/stosb, set up es
  361. X        pop    es        ; as destination.
  362. X        assume  es:@code    ; let the assembler know :-)
  363. X        cld            ; make sure direction is right
  364. X
  365. X; Copy all parameters into the bottom of the code segment.  After doing so we
  366. X; will immediately switch stacks, so that the user stack is preserved intact.
  367. X        mov    ax, ss:[a_swap]        ; save swap
  368. X        mov    es:swap, ax
  369. X        mov    ax, ss:[a_env]        ; save env seg to use
  370. X        mov    es:envseg, ax
  371. X        mov    ax, ss:[a_esiz]        ; get environment's size
  372. X        mov    es:envsize, ax
  373. X
  374. X        mov     di, offset cs:cmdpath    ; copy the command
  375. X        lds     si, ss:[a_prog]        ; 65 bytes worth
  376. X        mov    cx, 65
  377. X        call    copy_data
  378. X
  379. X        mov    di, offset cs:cmdtail    ; copy the command tail
  380. X        lds    si, ss:[a_tail]        ; 129 bytes worth
  381. X        mov    cx, 129
  382. X        call    copy_data
  383. X
  384. X        mov    di, offset cs:tmpname    ; copy the temp file name
  385. X        lds    si, ss:[a_tmp]        ; 65 bytes worth.
  386. X        mov    cx, 65
  387. X        call    copy_data
  388. X
  389. X; Now we save the current ss:sp stack pointer and swap stack to our temporary
  390. X; stack located in the current code segment.  At the same time we reset the
  391. X; segment pointers to point into the code segment only.
  392. Xswap_stacks:    mov    ax, ss
  393. X        mov    es:old_ss, ax
  394. X        mov    es:old_sp, sp
  395. X        mov    ax, cs
  396. X        mov    ds, ax
  397. X        mov    ss, ax            ; set ss first, ints are then
  398. X        mov    sp, offset cs:exec_sp    ; disabled for this instr too
  399. X        assume  ds:@code, ss:@code    ; let the assembler know :-)
  400. X
  401. X; Now we save the old control break and critical error handler addresses.
  402. X; We replace them by our own routines found in the resident portion of the
  403. X; swapping exec code.
  404. Xset_handlers:    mov    [interrupted], 0    ; clear interrupted flag
  405. X        mov    [retcode], 0        ; clear the return code
  406. X        mov    ax, 03523H        ; get int 23 handler address
  407. X        int    21H
  408. X        mov    cs:old_ctl_brk_off, bx
  409. X        mov    cs:old_ctl_brk_seg, es
  410. X        mov    dx, offset ctl_brk_handler
  411. X        mov    ax, 02523H        ; set int 23 handler address
  412. X        int    21H
  413. X
  414. X        mov    ax, 03524H        ; get int 24 handler address
  415. X        int    21H
  416. X        mov    cs:old_crit_err_off, bx
  417. X        mov    cs:old_crit_err_seg, es
  418. X        mov    dx, offset crit_err_handler
  419. X        mov    ax, 02524H        ; set int 24 handler address
  420. X        int    21H
  421. X
  422. X; Go and execute the child, we've set up all of it's parameters.  The do_exec
  423. X; routine will attempt to perform a swap of the code if requested to do so by
  424. X; a non-zero value in the variable cs:swap.
  425. X        mov    ah, 062H        ; get the psp
  426. X        int    21H
  427. X        mov    cs:psp, bx
  428. X        call    do_exec
  429. X
  430. X; We're back from the exec, so fix things up the way they were.
  431. X; Restore the old control-break and critical-error handlers.
  432. X        lds    dx, cs:old_ctl_brk
  433. X        mov    ax, 02523H
  434. X        int    21H
  435. X        lds    dx, cs:old_crit_err
  436. X        mov    ax, 02524H
  437. X        int    21H
  438. X
  439. X; Restore previous program stack segment registers, and data segment.
  440. X        mov    ax, cs:old_ss
  441. X        mov    ss, ax            ; mov into ss first, that way
  442. X        mov    sp, cs:old_sp        ; no interrupts in this instr.
  443. X        pop    ds
  444. X
  445. X; Tell the assembler we have swaped segments again.
  446. X        assume    ds:DGROUP,es:DGROUP,ss:DGROUP
  447. X
  448. X; Set the global Interrupted flag so that parent can tell it was interrupted.
  449. X        mov    ax, seg DGROUP:_Interrupted
  450. X        mov    es, ax
  451. X        mov    ax, cs:interrupted
  452. X        mov    es:_Interrupted, ax
  453. X
  454. X; Set the global errno value to reflect the success/failure of the DOS
  455. X; exec call.
  456. X        mov    ax, seg DGROUP:_errno
  457. X        mov    es, ax
  458. X        mov    ax, cs:ex_error
  459. X        mov    es:_errno, ax
  460. X
  461. X; Fetch the child's return code, pop rest of stuff off of the stack
  462. X; and return to the caller.
  463. X        mov    ax, cs:retcode
  464. X        pop    di
  465. X        pop    si
  466. X        pop    bp
  467. X        ret
  468. X_exec endp
  469. X
  470. Xend
  471. SHAR_EOF
  472. echo "File msdos/exec.asm is complete"
  473. chmod 0440 msdos/exec.asm || echo "restore of msdos/exec.asm fails"
  474. echo "x - extracting msdos/dirlib.h (Text)"
  475. sed 's/^X//' << 'SHAR_EOF' > msdos/dirlib.h &&
  476. X/* DIRLIB.H by M. J. Weinstein   Released to public domain 1-Jan-89 */
  477. X
  478. X#ifndef _DIRLIB_h_
  479. X#define _DIRLIB_h_
  480. X
  481. X#include <stdio.h>
  482. X#include "stdmacs.h"
  483. X
  484. X#define MAXNAMLEN   15
  485. X
  486. Xstruct direct {
  487. X   long              d_ino;
  488. X   unsigned short    d_reclen;
  489. X   unsigned short    d_namlen;
  490. X   char              d_name[MAXNAMLEN+1];
  491. X};
  492. X
  493. Xtypedef struct {
  494. X   char   fcb[21];
  495. X   char   attr;
  496. X   short  time;
  497. X   short  date;
  498. X   long   size;
  499. X   char   name[13];
  500. X} DTA;
  501. X
  502. Xtypedef struct {
  503. X   DTA    dd_dta;       /* disk transfer area for this dir.        */
  504. X   short  dd_stat;      /* status return from last lookup          */
  505. X   char   dd_name[1];   /* full name of file -- struct is extended */
  506. X} DIR;
  507. X
  508. Xextern DIR           *opendir   ANSI((char *));
  509. Xextern struct direct *readdir   ANSI((DIR *));
  510. Xextern long          telldir    ANSI((DIR *));
  511. Xextern void          seekdir    ANSI((DIR *, long));
  512. Xextern void          closedir   ANSI((DIR *));
  513. Xextern DTA           *findfirst ANSI((char *, DTA *));
  514. Xextern DTA           *findnext  ANSI((DTA *));
  515. X
  516. X#define rewinddir(dirp)   seekdir(dirp,0L)
  517. X#endif
  518. SHAR_EOF
  519. chmod 0440 msdos/dirlib.h || echo "restore of msdos/dirlib.h fails"
  520. echo "x - extracting msdos/dirbrk.c (Text)"
  521. sed 's/^X//' << 'SHAR_EOF' > msdos/dirbrk.c &&
  522. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/msdos/RCS/dirbrk.c,v 1.1 90/10/06 12:05:21 dvadura Exp $
  523. X-- SYNOPSIS -- define the directory separator string.
  524. X-- 
  525. X-- DESCRIPTION
  526. X--     Define this string for any character that may appear in a path name
  527. X--    and can be used as a directory separator.
  528. X--
  529. X-- AUTHOR
  530. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  531. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  532. X--
  533. X-- COPYRIGHT
  534. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  535. X-- 
  536. X--      This program is free software; you can redistribute it and/or
  537. X--      modify it under the terms of the GNU General Public License
  538. X--      (version 1), as published by the Free Software Foundation, and
  539. X--      found in the file 'LICENSE' included with this distribution.
  540. X-- 
  541. X--      This program is distributed in the hope that it will be useful,
  542. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  543. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  544. X--      GNU General Public License for more details.
  545. X-- 
  546. X--      You should have received a copy of the GNU General Public License
  547. X--      along with this program;  if not, write to the Free Software
  548. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  549. X--
  550. X-- LOG
  551. X--     $Log:    dirbrk.c,v $
  552. X * Revision 1.1  90/10/06  12:05:21  dvadura
  553. X * dmake Release, Version 3.6
  554. X * 
  555. X*/
  556. X
  557. X#include "extern.h"
  558. X#include <ctype.h>
  559. X
  560. X/* dos uses /, \, and : */
  561. Xchar*    DirBrkStr = "/\\:";
  562. X
  563. X/*
  564. X** Return TRUE if the name is the full specification of a path name to a file
  565. X** starting at the root of the file system, otherwise return FALSE
  566. X*/
  567. Xint
  568. XIf_root_path(name)
  569. Xchar *name;
  570. X{
  571. X   return( (strchr(DirBrkStr, *name) != NIL(char)) ||
  572. X           (isalpha(*name) && name[1] == ':') );
  573. X}
  574. SHAR_EOF
  575. chmod 0440 msdos/dirbrk.c || echo "restore of msdos/dirbrk.c fails"
  576. echo "x - extracting msdos/config.mk (Text)"
  577. sed 's/^X//' << 'SHAR_EOF' > msdos/config.mk &&
  578. X# This is an OS specific configuration file
  579. X#    It assumes that OBJDIR, TARGET and DEBUG are previously defined.
  580. X#    It defines    CFLAGS, LDARGS, CPPFLAGS, STARTUPFILE, LDOBJS
  581. X#    It augments    SRC, OBJDIR, TARGET, CFLAGS, LDLIBS
  582. X#
  583. X
  584. X# Memory model to compile for
  585. X# set to s - small, m - medium, c - compact, l - large
  586. XMODEL = c
  587. X
  588. XSTARTUPFILE    = $(OS)/startup.mk
  589. X
  590. XCPPFLAGS     = $(CFLAGS)
  591. XLDOBJS        = $(CSTARTUP) $(OBJDIR)/{$(<:f)}
  592. XLDARGS        = @$(LDTMPOBJ),$(TARGET),NUL.MAP$(LDTAIL)
  593. XLDTAIL        = ,@$(LDTMPLIB)$(LDFLAGS) NUL.DEF
  594. XLDTMPOBJ    = <+$(LDOBJS:s,/,\\,:t"+\n")\n+>
  595. XLDTMPLIB    = <+$(LDLIBS:s,/,\\,:t"+\n")\n+>
  596. X
  597. X# Debug flags
  598. XDB_CFLAGS    = -DDBUG -v
  599. XDB_LDFLAGS    = /v
  600. XDB_LDLIBS    =
  601. X
  602. X# NO Debug flags
  603. XNDB_CFLAGS    =
  604. XNDB_LDFLAGS    =
  605. XNDB_LDLIBS    =
  606. X
  607. X# Local configuration modifications for CFLAGS.
  608. XCFLAGS         += -I$(OS)
  609. X
  610. X# Common MSDOS source files.
  611. X# Define NOSWAP to non-null for the swap code to be excluded on making.
  612. X.IF $(NOSWAP) == $(NULL)
  613. X   SWP_SRC = find.c spawn.c
  614. X   ASRC += exec.asm
  615. X.END
  616. X
  617. XOS_SRC  += ruletab.c dirbrk.c runargv.c arlib.c _chdir.c switchar.c rmprq.c\
  618. X        $(SWP_SRC)
  619. XSRC += $(OS_SRC)
  620. X.SETDIR=$(OS) : $(ASRC) $(OS_SRC)
  621. X
  622. X# Provide our own %$O : %$S rule.
  623. X%$O : %$S
  624. X    $(AS) $(ASFLAGS) $(<:s,/,\,);
  625. X    mv $(@:f) $(OBJDIR)
  626. X
  627. X# Set source dirs so that we can find files named in this
  628. X# config file.
  629. X.SOURCE.h : $(OS)
  630. X
  631. X# See if we modify anything in the lower levels.
  632. X.IF $(OSRELEASE) != $(NULL)
  633. X   .INCLUDE .IGNORE : $(OS)$(DIRSEPSTR)$(OSRELEASE)$(DIRSEPSTR)config.mk
  634. X.END
  635. X
  636. X# Set the proper macros based on whether we are making the debugging version
  637. X# or not.
  638. X.IF $(DEBUG)
  639. X   CFLAGS    += $(DB_CFLAGS)
  640. X   LDFLAGS    += $(DB_LDFLAGS)
  641. X   LDLIBS    += $(DB_LDLIBS)
  642. X
  643. X   SILENT    := $(.SILENT)
  644. X   .SILENT    := yes
  645. X   TARGET    := db$(TARGET)
  646. X   OBJDIR    := $(OBJDIR).dbg
  647. X   .SILENT    := $(SILENT)
  648. X
  649. X   SRC        += dbug.c malloc.c
  650. X   HDR        += db.h 
  651. X
  652. X   .SOURCE.c : common
  653. X   .SOURCE.h : common
  654. X.ELSE
  655. X   CFLAGS    += $(NDB_CFLAGS)
  656. X   LDFLAGS    += $(NDB_LDFLAGS)
  657. X   LDLIBS    += $(NDB_LDLIBS)
  658. X.END
  659. SHAR_EOF
  660. chmod 0640 msdos/config.mk || echo "restore of msdos/config.mk fails"
  661. echo "x - extracting msdos/arlib.c (Text)"
  662. sed 's/^X//' << 'SHAR_EOF' > msdos/arlib.c &&
  663. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/msdos/RCS/arlib.c,v 1.1 90/10/06 12:05:19 dvadura Exp $
  664. X-- SYNOPSIS -- Library access code.
  665. X-- 
  666. X-- DESCRIPTION
  667. X--    This implementation uses the library timestamp inplace of the
  668. X--    library member timestamp.
  669. X--
  670. X-- AUTHOR
  671. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  672. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  673. X--
  674. X-- COPYRIGHT
  675. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  676. X-- 
  677. X--      This program is free software; you can redistribute it and/or
  678. X--      modify it under the terms of the GNU General Public License
  679. X--      (version 1), as published by the Free Software Foundation, and
  680. X--      found in the file 'LICENSE' included with this distribution.
  681. X-- 
  682. X--      This program is distributed in the hope that it will be useful,
  683. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  684. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  685. X--      GNU General Public License for more details.
  686. X-- 
  687. X--      You should have received a copy of the GNU General Public License
  688. X--      along with this program;  if not, write to the Free Software
  689. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  690. X--
  691. X-- LOG
  692. X--     $Log:    arlib.c,v $
  693. X * Revision 1.1  90/10/06  12:05:19  dvadura
  694. X * dmake Release, Version 3.6
  695. X * 
  696. X*/
  697. X
  698. X#include "extern.h"
  699. X#include "stdmacs.h"
  700. X#include "vextern.h"
  701. X
  702. Xtime_t
  703. Xseek_arch(name, lib)
  704. Xchar*    name;
  705. Xchar*    lib;
  706. X{
  707. X   static    int    warned = FALSE;
  708. X
  709. X   if (!warned && !(Glob_attr&A_SILENT))
  710. X       warned = TRUE,
  711. X       Warning("Can't extract library member timestamp;\n\
  712. X       using library timestamp instead.");
  713. X   return (Do_stat(lib, NULL, NULL));
  714. X}
  715. X
  716. Xint
  717. Xtouch_arch(name, lib)
  718. Xchar*    name;
  719. Xchar*    lib;
  720. X{
  721. X   static    int    warned = FALSE;
  722. X
  723. X   if (!warned && !(Glob_attr&A_SILENT))
  724. X       warned = TRUE,
  725. X       Warning("Can't update library member timestamp;\n\
  726. X       touching library instead.");
  727. X   return (Do_touch(lib, NULL, NULL));
  728. X}
  729. X
  730. SHAR_EOF
  731. chmod 0440 msdos/arlib.c || echo "restore of msdos/arlib.c fails"
  732. echo "x - extracting msdos/_chdir.c (Text)"
  733. sed 's/^X//' << 'SHAR_EOF' > msdos/_chdir.c &&
  734. X/* RCS      -- $Header: /u2/dvadura/src/generic/dmake/src/msdos/RCS/_chdir.c,v 1.1 90/10/06 12:05:17 dvadura Exp $
  735. X-- SYNOPSIS -- Change directory.
  736. X-- 
  737. X-- DESCRIPTION
  738. X--    Under DOS change the current drive as well as the current directory.
  739. X--
  740. X-- AUTHOR
  741. X--      Dennis Vadura, dvadura@watdragon.uwaterloo.ca
  742. X--      CS DEPT, University of Waterloo, Waterloo, Ont., Canada
  743. X--
  744. X-- COPYRIGHT
  745. X--      Copyright (c) 1990 by Dennis Vadura.  All rights reserved.
  746. X-- 
  747. X--      This program is free software; you can redistribute it and/or
  748. X--      modify it under the terms of the GNU General Public License
  749. X--      (version 1), as published by the Free Software Foundation, and
  750. X--      found in the file 'LICENSE' included with this distribution.
  751. X-- 
  752. X--      This program is distributed in the hope that it will be useful,
  753. X--      but WITHOUT ANY WARRANTY; without even the implied warrant of
  754. X--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  755. X--      GNU General Public License for more details.
  756. X-- 
  757. X--      You should have received a copy of the GNU General Public License
  758. X--      along with this program;  if not, write to the Free Software
  759. X--      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  760. X--
  761. X-- LOG
  762. X--     $Log:    _chdir.c,v $
  763. X * Revision 1.1  90/10/06  12:05:17  dvadura
  764. X * dmake Release, Version 3.6
  765. X * 
  766. X*/
  767. X
  768. X#include <dos.h>
  769. X#include "sysintf.h"
  770. X#include "vextern.h"
  771. X
  772. X#undef   chdir         /* sysintf.h defines it to _chdir for DOS */
  773. X
  774. Xint
  775. X_chdir(path)
  776. Xchar *path;
  777. X{
  778. X   int   res;
  779. X
  780. X   res = chdir(path);
  781. X
  782. X#if defined(OS2)
  783. X   if (res != -1 && path[1] == ':' && *path != *Pwd) {
  784. X      unsigned new_drive;
  785. X      unsigned max_drives;
  786. X
  787. X      /* for OS2 we must change drive without using intdos() */
  788. X      new_drive = (*path & ~0x20) - 'A' + 1;
  789. X      _dos_setdrive(new_drive, &max_drives);
  790. X   }
  791. X#else
  792. X   if (res != -1 && path[1] == ':' && *path != *Pwd) {
  793. X      union REGS  reg;
  794. X
  795. X      /* we must change the logged drive, since the chdir worked. */
  796. X      reg.h.ah = 0x0E;
  797. X      reg.h.dl = (*path & ~0x20) - 'A';
  798. X      intdos(®, ®);
  799. X   }
  800. X#endif /* OS2 */
  801. X   return (res);
  802. X}
  803. X
  804. SHAR_EOF
  805. chmod 0440 msdos/_chdir.c || echo "restore of msdos/_chdir.c fails"
  806. echo mkdir - man
  807. mkdir man
  808. echo "x - extracting man/dmake.tf (Text)"
  809. sed 's/^X//' << 'SHAR_EOF' > man/dmake.tf &&
  810. X.\" Copyright (c) 1990 Dennis Vadura, All rights reserved.
  811. X.\"
  812. X.ds TB "0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.2i +0.5i +0.5i +2.0i
  813. X.de Ip
  814. X.fi
  815. X.nr Ip \w\\$1 
  816. X.IP "\\$1" \\n(Ipu
  817. X\\$2
  818. X.nf
  819. X..
  820. X.de Is
  821. X.nr )I \w\\$1u
  822. X..
  823. X.de Ii
  824. X.in \\n()Ru
  825. X.nr )E 1
  826. X.ns
  827. X.ne 1.1v
  828. X.it 1 }N
  829. X.di ]B
  830. X\&\\$1
  831. X..
  832. X.TH DMAKE p  "UW" "Version 3.50" "Unsupported Software"
  833. X.SH NAME
  834. X\fBdmake\fR \- maintain program groups, or interdependent files
  835. X.SH SYNOPSIS
  836. X.B dmake
  837. X[-AeEhiknpqersStTuvVx] [-P#] [macro[*][+][:]=\fIvalue\fP] [-f file] [target ...]
  838. X.SH DESCRIPTION
  839. X.PP
  840. X.B dmake
  841. Xexecutes commands found in an external file called a
  842. X.I makefile
  843. Xto update one or more target names.
  844. XEach target may depend on zero or more prerequisite targets.
  845. XIf any of the target's prerequisites is newer than the target or if the target
  846. Xitself does not exist, then
  847. X.B dmake
  848. Xwill attempt to make the target.
  849. X.PP
  850. XIf no
  851. X.B \-f
  852. Xcommand line option is present then
  853. X.B dmake
  854. Xsearches for an existing
  855. X.I makefile
  856. Xfrom the list of prerequisites specified for the special target \fI.MAKEFILES\fR
  857. X(see the STARTUP section for more details).
  858. XIf "-" is the name of the file specified to the
  859. X.B -f
  860. Xflag then \fBdmake\fR uses standard input as the source of the makefile text.
  861. X.PP
  862. XAny macro definitions (arguments with embedded
  863. X.Q "="
  864. Xsigns) that appear on the command line are processed first
  865. Xand supercede definitions for macros of the same name found
  866. Xwithin the makefile.  In general it is impossible for definitions found
  867. Xinside the makefile to redefine a macro defined on the command line, see the
  868. XMACROS section for an exception.
  869. X.PP
  870. XIf no
  871. X.I target
  872. Xnames are specified on the command line, then \fBdmake\fR uses the first
  873. Xnon-special target found in the makefile as the default target.
  874. XSee the
  875. X.B "SPECIAL TARGETS"
  876. Xsection for the list of special targets and their function.
  877. X\fBdmake\fR is a re-implementation of the UNIX Make utility with
  878. Xsignificant enhancements.  Makefiles written for most previous
  879. Xversions of
  880. X.I make
  881. Xwill be handled correctly by 
  882. X.B dmake.
  883. XKnown differences between \fBdmake\fR and other versions of make
  884. Xare discussed in the
  885. X.B COMPATIBILITY
  886. Xsection found at the end of this document.
  887. X.SH OPTIONS
  888. X.IP "\fB\-A\fR"
  889. XEnable AUGMAKE special inference rule transformations (see the
  890. X.Q "PERCENT(%) RULES"
  891. Xsection), these are set to off by default.
  892. X.IP "\fB\-e\fR"
  893. XRead the environment and define all strings of the
  894. Xform '\fBENV-VAR\fP=\fIevalue\fP'
  895. Xdefined within as macros whose name is \fBENV-VAR\fP,
  896. Xand whose value is '\fIevalue\fP'.
  897. XThe environment is processed prior to processing the user
  898. Xspecified makefile thereby allowing definitions in the makefile to override
  899. Xdefinitions in the environment.
  900. X.IP "\fB\-E\fR"
  901. XSame as -e, except that the environment is processed after the
  902. Xuser specified makefile has been processed
  903. X(thus definitions in the environment override definitions in the makefile).
  904. XThe -e and -E options are mutually exclusive.
  905. XIf both are given the latter one takes effect.
  906. X.IP "\fB\-f file\fR"
  907. XUse \fBfile\fR as the source for the makefile text.
  908. XOnly one \fB\-f\fR option is allowed.
  909. X.IP "\fB\-h\fR"
  910. XPrint the command summary for \fBdmake\fR.
  911. X.IP "\fB\-i\fR"
  912. XTells \fBdmake\fR to ignore errors, and continue making other targets.
  913. XThis is equivalent to the .IGNORE attribute or macro.
  914. X.IP "\fB\-k\fR"
  915. XCauses \fBdmake\fR to ignore errors caused by command execution and to make
  916. Xall targets not depending on targets that could not be made. 
  917. XOrdinarily \fBdmake\fR stops after a command returns a non-zero status,
  918. Xspecifying \fB\-k\fR causes \fBdmake\fR to ignore the error
  919. Xand continue to make as much as possible.
  920. X.IP "\fB\-n\fR"
  921. XCauses \fBdmake\fR to print out what it would have executed,
  922. Xbut does not actually execute the commands.  A special check is made for
  923. Xthe string "$(MAKE)" inside a recipe line, if found, the line is expanded
  924. Xand invoked, thereby enabling recursive makes to give a full
  925. Xdescription of all that they will do.
  926. XThe check for "$(MAKE)" is disabled inside group recipes.
  927. X.IP "\fB\-p\fR"
  928. XPrint out a version of the digested makefile in human readable form.
  929. X(useful for debugging, but cannot be re-read by \fBdmake\fP)
  930. X.IP "\fB\-P#\fR"
  931. XOn systems that support multi-processing cause \fBdmake\fP to use \fI#\fP
  932. Xconcurrent child processes to make targets.  See the
  933. X.Q "MULTI PROCESSING"
  934. Xsection for more information.
  935. X.IP "\fB\-q\fR"
  936. XCheck and see if the target is up to date.  Exits with code 0 if up to date,
  937. X1 otherwise.
  938. X.IP "\fB\-r\fR"
  939. XTells \fBdmake\fR not to read the initial startup makefile, see STARTUP
  940. Xsection for more details.
  941. X.IP "\fB\-s\fR"
  942. XTells \fBdmake\fR to do all its work silently and not echo the commands it is
  943. Xexecuting to stdout (also suppresses warnings).
  944. XThis  is equivalent to the .SILENT attribute or macro.
  945. X.IP "\fB\-S\fR"
  946. XForce sequential execution of recipes on architectures which support
  947. Xconcurrent makes.  For backward compatibility with old makefiles that have
  948. Xnasty side-effect prerequisite dependencies.
  949. X.IP "\fB\-t\fR"
  950. XCauses \fBdmake\fR to touch the targets and bring them up to date
  951. Xwithout executing any commands.
  952. X.IP "\fB\-T\fR"
  953. XTells \fBdmake\fP to not perform transitive closure on the inference graph.
  954. X.IP "\fB\-u\fR"
  955. XForce an unconditional update.  (ie. do everything that would
  956. Xbe done if everything that a target depended on was out of date)
  957. X.IP "\fB\-v\fR"
  958. XVerbose flag, when making targets print to stdout what we are going to make
  959. Xand what we think it's timestamp is.
  960. X.IP "\fB\-V\fR"
  961. XPrint the version of \fBdmake\fR, and values of builtin macros.
  962. X.IP "\fB\-x\fR"
  963. XUpon processing the user makefile export all non-internally defined macros
  964. Xto the user's environment.  This option together with the -e option
  965. Xallows SYSV AUGMAKE recursive makes to function as expected.
  966. X.SH INDEX
  967. XHere is a list of the sections that follow and a short description of each.
  968. XPerhaps you won't have to read the whole man page to find
  969. Xwhat you need.
  970. X.IP \fBSTARTUP\fP 1.9i
  971. XDescribes \fBdmake\fP initialization.
  972. X.IP \fBSYNTAX\fP 1.9i
  973. XDescribes the syntax of makefile expressions.
  974. X.IP \fBATTRIBUTES\fP 1.9i
  975. XDescribes the notion of attributes and how they are used when
  976. Xmaking targets.
  977. X.IP \fBMACROS\fP 1.9i
  978. XDefining and expanding macros.
  979. X.IP "\fBRULES AND TARGETS" 1.9i
  980. XHow to define targets and their prerequisites.
  981. X.IP \fBRECIPES\fP 1.9i
  982. XHow to tell \fBdmake\fP how to make a target.
  983. X.IP "\fBTEXT DIVERSIONS\fP" 1.9i
  984. XHow to use text diversions in recipes and macro expansions.
  985. X.IP "\fBSPECIAL TARGETS\fP" 1.9i
  986. XSome targets are special.
  987. X.IP "\fBSPECIAL MACROS\fP" 1.9i
  988. XMacros used by \fBdmake\fP to alter the processing of the makefile,
  989. Xand those defined by \fBdmake\fP for the user.
  990. X.IP "\fBCONTROL MACROS\fP" 1.9i
  991. XItemized list of special control macros.
  992. X.IP "\fBRUN-TIME MACROS\fP" 1.9i
  993. XDiscussion of special run-time macros such as $@ and $<.
  994. X.IP "\fBFUNCTION MACROS\fP" 1.9i
  995. XGNU style function macros, only $(mktmp ...) for now.
  996. X.IP "\fBDYNAMIC PREREQUISITES\fP" 1.9i
  997. XProcessing of prerequisites which contain macro expansions in their name.
  998. X.IP "\fBBINDING TARGETS\fP" 1.9i
  999. XThe rules that \fBdmake\fP uses to bind
  1000. Xa target to an existing file in the file system.
  1001. X.IP "\fBPERCENT(%) RULES\fP" 1.9i
  1002. XSpecification of recipes to be used by the inference algorithm.
  1003. X.IP "\fBMAKING INFERENCES\fP" 1.9i
  1004. XThe rules that \fBdmake\fP uses when inferring how to make a target which
  1005. Xhas no explicit recipe.  This and the previous section are really a single
  1006. Xsection in the text.
  1007. X.IP "\fBMAKING TARGETS\fP" 1.9i
  1008. XHow \fBdmake\fP makes targets other than libraries.
  1009. X.IP "\fBMAKING LIBRARIES\fP" 1.9i
  1010. XHow \fBdmake\fP makes libraries.
  1011. X.IP "\fBMULTI PROCESSING\fP" 1.9i
  1012. XDiscussion of \fBdmake's\fP parallel make facilities for architectures that
  1013. Xsupport them.
  1014. X.IP "\fBCONDITIONALS\fP" 1.9i
  1015. XConditional expressions which control the processing of the makefile.
  1016. X.IP "\fBEXAMPLES\fP" 1.9i
  1017. XSome hopefully useful examples.
  1018. X.IP "\fBCOMPATIBILITY\fP" 1.9i
  1019. XHow \fBdmake\fP compares with previous versions of make.
  1020. X.IP "\fBLIMITS\fP" 1.9i
  1021. XLimitations of \fBdmake\fP.
  1022. X.IP \fBPORTABILITY\fP 1.9i
  1023. XComments on writing portable makefiles.
  1024. X.IP \fBFILES\fP 1.9i
  1025. XFiles used by \fBdmake\fP.
  1026. X.IP "\fBSEE ALSO\fP" 1.9i
  1027. XOther related programs, and man pages.
  1028. X.IP "\fBAUTHOR\fP" 1.9i
  1029. XThe guy responsible for this thing.
  1030. X.IP \fBBUGS\fP 1.9i
  1031. XHope not.
  1032. X.SH STARTUP
  1033. XWhen
  1034. X.B dmake
  1035. Xbegins execution it first processes the command line and then processes
  1036. Xan initial startup-makefile.
  1037. XThis is followed by an attempt to locate and process a user supplied makefile.
  1038. XThe startup file defines the default values of all required control macros
  1039. Xand the set of default rules for making inferences.
  1040. XWhen searching for the startup makefile,
  1041. X.B dmake
  1042. Xsearches the following locations, in order, until a startup file is located:
  1043. X.LP
  1044. X.RS
  1045. X.IP 1.
  1046. XThe location given as the value of the macro MAKESTARTUP defined on the
  1047. Xcommand line.
  1048. X.IP 2.
  1049. XThe location given as the value of the environment variable MAKESTARTUP
  1050. Xdefined in the current environment.
  1051. X.IP 3.
  1052. XThe location given as the value of the macro MAKESTARTUP defined internally
  1053. Xwithin \fBdmake\fP.
  1054. X.RE
  1055. X.LP
  1056. XThe above search is disabled by specifying the -r option on the command line.
  1057. XAn error is issued if a startup makefile cannot be found and the -r
  1058. Xoption was not specified.
  1059. XA user may substitute a custom startup file by defining
  1060. Xthe MAKESTARTUP environment variable or by redefining the
  1061. XMAKESTARTUP macro on the command line.
  1062. XTo determine where
  1063. X.B dmake
  1064. Xlooks for the default startup file, check your environment or issue the command
  1065. X\fI"dmake -V"\fP.
  1066. X.PP
  1067. XA similar search is performed to locate a default user makefile when no
  1068. X\fB-f\fP command line option is specified.
  1069. XThe special target .MAKEFILES is defined by default.
  1070. XThis target's prerequisite list specifies the names of files and the order that
  1071. X\fBdmake\fP will use to search for them when attempting to locate the default
  1072. Xmakefile.
  1073. XA typical definition for this target is:
  1074. X.RS
  1075. X.sp
  1076. X\&.MAKEFILES : makefile.mk Makefile makefile
  1077. X.sp
  1078. X.RE
  1079. X\fBdmake\fP will first look for makefile.mk and then the others.
  1080. XIf a prerequisite
  1081. Xcannot be found \fBdmake\fP will try to make it before going on to the next
  1082. Xprerequisite.  For example, makefile.mk can be checked out of an RCS file
  1083. Xif the proper rules for doing so are defined in the startup file.
  1084. X.SH SYNTAX
  1085. XThis section is a summary of the syntax of makefile statements.
  1086. XThe description is given in a style similar to BNF, where { } enclose
  1087. Xitems that may appear zero or more times, and [ ] enclose items that
  1088. Xare optional.  Alternative productions for a left hand side are indicated
  1089. Xby '->', and newlines are significant.  All symbols in \fBbold\fP type
  1090. Xare text or names representing text supplied by the user.
  1091. X.sp 2
  1092. X.RS
  1093. X.Ip "Makefile" "\(-> { Statement }"
  1094. X.Ip "Statement" "\(-> Macro-Definition"
  1095. X\(-> Conditional
  1096. X\(-> Rule-Definition
  1097. X\(-> Attribute-Definition
  1098. X.Ip "Macro-Definition" "\(-> \fBMACRO = LINE\fP"
  1099. X\(-> \fBMACRO *= LINE\fP
  1100. X\(-> \fBMACRO := LINE\fP
  1101. X\(-> \fBMACRO *:= LINE\fP
  1102. X\(-> \fBMACRO += LINE\fP
  1103. X\(-> \fBMACRO +:= LINE\fP
  1104. X.Ip "Conditional \(-> " "\fB\&.IF\fR expression"
  1105. X   Makefile
  1106. X[ \fB.ELSE\fR
  1107. X   Makefile ]
  1108. X\fB\&.END\fR
  1109. X.Ip expression    "\(-> \fBLINE\fR"
  1110. X\(-> \fBSTRING == LINE\fR
  1111. X\(-> \fBSTRING != LINE\fR
  1112. X.sp
  1113. X.Ip "Rule-Definition \(-> " "target-definition"
  1114. X   [ recipe ]
  1115. X.PP
  1116. Xtarget-definition \(-> targets [attrs] op { \fBPREREQUISITE\fP } [\fB;\fR rcp-line]
  1117. X.Ip "targets" "\(-> target { targets }"
  1118. X\(-> \fB"\fRtarget\fB"\fR { targets }
  1119. X.Ip "target" "\(-> special-target"
  1120. X\(-> \fBTARGET\fR
  1121. X.Ip "attrs" "\(-> attribute { attrs }"
  1122. X\(-> \fB"\fRattribute\fB"\fR { attrs }
  1123. X.Ip "op" "\(-> \fB:\fR { modifier }"
  1124. X.Ip "modifier" "\(-> \fB:\fR"
  1125. X\(-> \fB^\fR
  1126. X\(-> \fB!\fR
  1127. X\(-> \fB-\fR
  1128. X.Ip "recipe" "\(-> { \fBTAB\fR rcp-line }"
  1129. X\(-> [\fB@\fR][\fB%\fR][\fB-\fR] \fB[
  1130. X.Is "recipe \(-> "
  1131. X.Ii " "
  1132. X   \fR{ \fBLINE\fR }
  1133. X.Ii " "
  1134. X\fB]\fR
  1135. X.Ip "rcp-line" "\(-> [\fB@\fR][\fB%\fR][\fB-\fR][\fB+\fR] \fBLINE\fR"
  1136. X.sp
  1137. X.Ip Attribute-Definition "\(-> attrs \fB:\fR targets"
  1138. X.sp
  1139. X.Ip "attribute"     "\(-> \fB.EPILOG\fR"
  1140. X\(-> \fB.IGNORE\fR
  1141. X\(-> \fB.LIBRARY\fR
  1142. X\(-> \fB.MKSARGS\fR
  1143. X\(-> \fB.NOINFER\fR
  1144. X\(-> \fB.PRECIOUS\fR
  1145. X\(-> \fB.PROLOG\fR
  1146. X\(-> \fB.SETDIR=\fIpath\fP\fR
  1147. X\(-> \fB.SILENT\fR
  1148. X\(-> \fB.SEQUENTIAL\fR
  1149. X\(-> \fB.SWAP\fR
  1150. X\(-> \fB.USESHELL\fR
  1151. X\(-> \fB.SYMBOL\fR
  1152. X\(-> \fB.UPDATEALL\fR
  1153. X.Ip "special-target" "\(-> \fB.ERROR\fR"
  1154. X\(-> \fB.EXPORT\fR
  1155. X\(-> \fB.GROUPEPILOG\fR
  1156. X\(-> \fB.GROUPPROLOG\fR
  1157. X\(-> \fB.IMPORT\fR
  1158. X\(-> \fB.INCLUDE\fR
  1159. X\(-> \fB.INCLUDEDIRS\fR
  1160. X\(-> \fB.MAKEFILES\fR
  1161. X\(-> \fB.REMOVE\fR
  1162. X\(-> \fB.SOURCE\fR
  1163. X\(-> \fB.SOURCE.\fIsuffix\fR
  1164. X\(-> .\fIsuffix1\fR.\fIsuffix2\fR
  1165. X.fi
  1166. X.RE
  1167. X.sp 1
  1168. X.PP
  1169. XWhere, \fBTAB\fP represents a <tab> character, \fBSTRING\fP represents an
  1170. Xarbitrary sequence of characters, and
  1171. X\fBLINE\fP represents a
  1172. Xpossibly empty sequence of characters terminated by a non-escaped 
  1173. X(not immediately preceded by a backslash '\\') new-line character.
  1174. X\fBMACRO\fP, \fBPREREQUISITE\fP,
  1175. Xand \fBTARGET\fP each represent a string of characters not
  1176. Xincluding space or tab which respectively form the name of a macro,
  1177. Xprerequisite or target.
  1178. XThe name may itself be a macro expansion expression.
  1179. XA \fBLINE\fP can be continued over several physical lines by terminating it with
  1180. Xa single backslash character.  Comments are initiated by the
  1181. Xpound '\fB#\fR' character and extend to the end of line.
  1182. XAll comment text is discarded, a '#' may be placed into the makefile text
  1183. Xby escaping it with '\\' (ie. \\# translates to # when
  1184. Xit is parsed).
  1185. XA group of continued lines may be commented out by placing a single # at the
  1186. Xstart of the first line of the group.
  1187. XA continued line may not span more than one makefile.
  1188. X.PP
  1189. X\fBwhite space\fP is defined to be any combination of
  1190. X<space>, <tab>, and the sequence \\<nl>
  1191. Xwhen \\<nl> is used to terminate a LINE.
  1192. XWhen processing \fBmacro\fP definition lines,
  1193. Xany amount of white space is allowed on either side of the macro operator
  1194. X(=, *=, :=, *:=, += or +:=), and
  1195. Xwhite space is stripped from both before and after the macro
  1196. Xvalue string.
  1197. XThe sequence \\<nl> is treated as
  1198. Xwhite space during recipe expansion
  1199. Xand is deleted from the final recipe string.
  1200. XYou must escape the \\<nl> with a \\ in order to get a \\ at the end
  1201. Xof a recipe line.
  1202. XThe \\<nl> sequence is deleted from macro values when they are expanded.
  1203. X.PP
  1204. XWhen processing \fBtarget\fP definition lines,
  1205. Xthe recipe for a target must, in general, follow the first definition
  1206. Xof the target (See the RULES AND TARGETS section for an exception), and
  1207. SHAR_EOF
  1208. echo "End of part 10"
  1209. echo "File man/dmake.tf is continued in part 11"
  1210. echo "11" > s2_seq_.tmp
  1211. exit 0
  1212.  
  1213.